#pragma once

#include <string>
#include <chrono>
#include <vector>
#include <utility>
#include <cstdint>

namespace hft {

/**
 * @brief 市场数据类型枚举
 * 
 * @details 定义不同类型的市场数据，用于区分行情数据的来源和类型
 */
enum class MarketDataType {
    UNKNOWN = 0,    ///< 未知类型，默认值
    LOGIN = 1,      ///< 登录响应，用于确认连接状态
    DEPTH = 2,      ///< 深度行情数据，包含买卖盘信息
    TRADE = 3       ///< 成交数据，包含逐笔成交信息
};

// 基础数据类型
using Timestamp = std::chrono::system_clock::time_point;
using Price = double;
using Volume = double;
using OrderId = std::string;
using Symbol = std::string;

/**
 * @brief 订单方向枚举
 * 
 * @details 定义订单的买卖方向
 */
enum class OrderDirection {
    BUY,    ///< 买入方向
    SELL    ///< 卖出方向
};

/**
 * @brief 开平标志枚举
 * 
 * @details 定义期货交易的开仓/平仓类型
 */
enum class OrderOffset {
    OPEN,           ///< 开仓
    CLOSE,          ///< 平仓(自动区分今昨仓)
    CLOSE_TODAY,    ///< 平今仓
    CLOSE_YESTERDAY ///< 平昨仓
};

/**
 * @brief 订单类型枚举
 * 
 * @details 定义不同类型的订单执行方式
 */
enum class OrderType {
    LIMIT,          ///< 限价单 - 按指定或更好价格成交
    MARKET,         ///< 市价单 - 按当前最优价立即成交
    STOP,           ///< 止损单 - 触发后按市价成交
    STOP_LIMIT,     ///< 止损限价单 - 触发后按限价成交
    FAK,            ///< 立即成交或取消 - 部分成交后剩余自动撤销
    FOK             ///< 全部成交或取消 - 不满足全部数量则自动撤销
};

/**
 * @brief 订单状态枚举
 * 
 * @details 定义订单生命周期中的各种状态
 */
enum class OrderStatusType {
    SUBMITTED,      ///< 已提交 - 订单已发送到交易所
    ACCEPTED,       ///< 已接受 - 交易所已接收订单
    PARTIAL_FILLED, ///< 部分成交 - 订单部分成交
    FILLED,         ///< 全部成交 - 订单完全成交
    CANCELLED,      ///< 已撤销 - 订单被手动撤销
    REJECTED,       ///< 已拒绝 - 订单被交易所拒绝
    EXPIRED         ///< 已过期 - 订单超过有效期未成交
};

/**
 * @brief 完整的市场行情数据结构
 * 
 * @details 包含合约的完整行情信息，包括五档买卖盘、成交统计等
 */
struct MarketData {
    Symbol symbol;                    ///< 合约代码，格式为"交易所代码.合约代码"，如"SHFE.cu2301"
    MarketDataType type = MarketDataType::UNKNOWN; ///< 数据类型: 0=未知,1=登录,2=深度行情,3=成交
    Price last_price;                 ///< 最新价，单位: 元/吨(商品期货)或点(股指期货)
    Price open_price;                 ///< 当日开盘价，单位同上
    Price high_price;                 ///< 当日最高价，单位同上
    Price low_price;                  ///< 当日最低价，单位同上
    Price pre_close_price;            ///< 昨日收盘价，单位同上
    Price pre_settlement_price;       ///< 昨日结算价，单位同上
    Price settlement_price;           ///< 当日结算价，单位同上
    Volume volume;                    ///< 当日成交量，单位: 手(商品期货)或张(股指期货)
    Volume turnover;                  ///< 当日成交额，单位: 元
    int64_t open_interest;           ///< 持仓量，单位: 手
    Price bid_price[5];              ///< 买价数组，[0]为最优买价，单位: 元/吨或点
    Volume bid_volume[5];            ///< 买量数组，对应bid_price，单位: 手
    Price ask_price[5];              ///< 卖价数组，[0]为最优卖价，单位: 元/吨或点
    Volume ask_volume[5];            ///< 卖量数组，对应ask_price，单位: 手
    Timestamp timestamp;              ///< 行情时间戳，UTC时间，精度到毫秒
};

/**
 * @brief 简化版市场数据消息
 * 
 * @details 包含行情核心字段，用于策略快速处理，减少数据拷贝开销
 * @note 相比完整MarketData，省略了历史价格和五档行情
 * @see MarketData 完整行情数据结构
 */
struct MarketDataMessage {
    Symbol symbol;          ///< 合约代码，格式为"交易所代码.合约代码"
    Price last_price;       ///< 最新价，单位: 元/吨或点
    Price bid_price;        ///< 最优买价(一档)，单位同上
    Price ask_price;        ///< 最优卖价(一档)，单位同上
    Volume bid_volume;      ///< 最优买量(一档)，单位: 手
    Volume ask_volume;      ///< 最优卖量(一档)，单位: 手
    Volume volume;          ///< 当日成交量，单位: 手
    Volume turnover;        ///< 当日成交额，单位: 元
    Timestamp timestamp;    ///< 行情时间戳，UTC时间，精度到毫秒
};

/**
 * @brief 完整的市场数据快照
 * 
 * @details 包含合约的完整行情信息，用于存档和事后分析
 * @note 相比MarketDataMessage，包含全部五档行情和历史价格数据
 * @see MarketDataMessage 简化版行情数据结构
 */
struct MarketDataSnapshot {
    Symbol symbol;                    ///< 合约代码，格式为"交易所代码.合约代码"
    Price last_price;                 ///< 最新价，单位: 元/吨或点
    Price open_price;                 ///< 当日开盘价，单位同上
    Price high_price;                 ///< 当日最高价，单位同上
    Price low_price;                  ///< 当日最低价，单位同上
    Price pre_close_price;            ///< 昨日收盘价，单位同上
    Price pre_settlement_price;       ///< 昨日结算价，单位同上
    Price settlement_price;           ///< 当日结算价，单位同上
    Volume volume;                    ///< 当日成交量，单位: 手
    Volume turnover;                  ///< 当日成交额，单位: 元
    int64_t open_interest;           ///< 持仓量，单位: 手
    Price bid_price[5];              ///< 买价数组，[0]为最优买价，单位: 元/吨或点
    Volume bid_volume[5];            ///< 买量数组，对应bid_price，单位: 手
    Price ask_price[5];              ///< 卖价数组，[0]为最优卖价，单位: 元/吨或点
    Volume ask_volume[5];            ///< 卖量数组，对应ask_price，单位: 手
    Timestamp timestamp;             ///< 行情时间戳，UTC时间，精度到毫秒
};

// 订单簿数据结构
struct OrderBook {
    Symbol symbol;
    std::vector<std::pair<Price, Volume>> bids;
    std::vector<std::pair<Price, Volume>> asks;
    Timestamp timestamp;
};

// 订单
struct Order {
    OrderId order_id;
    Symbol symbol;
    OrderDirection direction;
    OrderOffset offset;
    OrderType type;
    Price price;
    Volume volume;
    Timestamp timestamp;
};

// 订单状态
struct OrderStatus {
    OrderId order_id;
    Symbol symbol;
    OrderStatusType status;
    Volume volume;
    Volume traded_volume;
    Price price;
    Timestamp timestamp;
};

// 成交
struct Trade {
    std::string trade_id;
    OrderId order_id;
    Symbol symbol;
    OrderDirection direction;
    OrderOffset offset;
    Price price;
    Volume volume;
    Timestamp timestamp;
};

// 持仓
struct Position {
    Symbol symbol;
    OrderDirection direction;
    Volume volume;
    Price open_price;
    double position_profit;
    double margin;
    Timestamp timestamp;
};

// 账户资金
struct Account {
    double balance;
    double available;
    double margin;
    double commission;
    double frozen_margin;
    double frozen_commission;
    Timestamp timestamp;
};

} // namespace hft